import axios from 'axios'
import qs from 'qs' // json格式化插件
import store from '@/store/index'
import router from '@/router'
import { Message } from 'element-ui';
import config from '@/utils/config' // 共通config文件
import { getUserToken, setUserToken, removeUserToken } from '@/utils/cookies'

// 默认配置
axios.defaults.baseURL = config.AXIOS_BASE_URL; // 基本路径
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8'; //配置请求头

// 创建axios实例
const service = axios.create({
  // 超时
  timeout: 10000,
  method: 'post',
})

// 请求拦截器
service.interceptors.request.use(config => {
    // 请求参数处理
    if(config.method === 'post'){
      if(config.data) for(var key in config.data){
        if(config.data[key] === null || config.data[key] === undefined || config.data[key] === "") delete config.data[key];
      }
      // 每次发送请求之前判断是否存在token
      // 如果存在，则统一在http请求的header都加上token，这样后台根据token判断你的登录情况
      // 即使本地存在token，也有可能token是过期的，所以在响应拦截器中要对返回状态进行判断
      if(!config.data) config.data = {};
      if(typeof config.data == "string") {
        let text = config.data;
        config.data = {};
        config.data[text] = text;
      }
      // 是否需要设置 token
      if (getUserToken()) {
        config.headers['Authorization'] = getUserToken() // 让每个请求携带自定义token 请根据实际情况自行修改
      }
      // 请求处理
      config.data = qs.stringify(config.data, {arrayFormat: 'indices', allowDots: true});
    }
    return config;
  },
  error => {
    return Promise.error(error);
  }
);
// 响应拦截器
service.interceptors.response.use(
  response => {
    if (response.status === 200) {
      // 返回值处理
      if(tools.checkBody(function(){
        tools.check(response.data.status == config.HTTP.RESPONSE_STATUS_SUCCESS, response.data.detail);
      })) return Promise.reject(response);
      return Promise.resolve(response.data);
    } else {
      return Promise.reject(response);
    }
  },
  error => {
    // 401登录问题，需要重新登录
    if (error.response && error.response.status === 401) {
      if(error.response && error.response.data && error.response.data.detail) console.log(error.response.data.detail);
      return Promise.reject(error.response);
    }
    // 主动取消
    if (axios.isCancel(error)) {
      console.log("请求主动取消");
    } else if (error.response && error.response.status) {
      return Promise.reject(error.response);
    }
    console.log(error);
    // 完全无结果，请求失败
    if(error.response){
      Message("请求失败，请确认网络正常:" + error.message);
      console.log("请求失败，请确认网络正常\n" + error.message);
    }else{
      console.log("请求失败，请确认网络正常");
      Message("请求失败，请确认网络正常");
    }
  }
);

export default service;